package cz.proks.easyhelpdesk.gwt.utils;

import java.util.LinkedList;
import java.util.List;

import org.jsonmaker.gwt.client.Jsonizer;
import org.jsonmaker.gwt.client.JsonizerParser;

import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.regexp.shared.RegExp;

public class JsonizerUtils {
    
    private static final RegExp NULLS_EXP = RegExp.compile(",?\\s*\"\\w*\":\\s*null", "g");
    private static final RegExp NESTED_COMMAS = RegExp.compile("{\\s*,", "g");
    private static final RegExp EMPTY_JSON = RegExp.compile("\\s*{\\s*}\\s*");            
    
    public static JSONValue getJsonValue(Jsonizer jsonizer, Object entity) {
        if (jsonizer == null || entity == null)
            return new JSONObject();
        
        String jsonStr = jsonizer.asString(entity);
        JSONValue json = JSONParser.parseLenient(jsonStr);
        return json;
    }
    
    @SuppressWarnings("unchecked")
    public static <Entity> Entity getEntity(Jsonizer jsonizer, JSONValue json) {
        if (jsonizer == null || json == null)
            return null;
        
        String jsonStr = processJsonForJsonizer(json);     
        
        if (isEmptyJson(jsonStr))
            return null;
        
        Entity entity = (Entity) JsonizerParser.parse(jsonizer, jsonStr);
        return entity;
    }
    
    public static <Entity> List<Entity> getListFromJsonArray(JSONValue json, Jsonizer jsonizer) {
        List<Entity> list = new LinkedList<Entity>();
        
        if (json == null || json.isArray() == null)
            return list;
        
        JSONArray array = json.isArray();
        for (int i = 0; i < array.size(); i++) {
            JSONValue entityJson = array.get(i);
            Entity entity = getEntity(jsonizer, entityJson);
            list.add(entity);
        }
        
        return list;
    }
    
    private static String processJsonForJsonizer(JSONValue json) {
        if (json == null)
            return null;
        
        String jsonStr = json.toString();
                
        jsonStr = NULLS_EXP.replace(jsonStr, "");
        jsonStr = NESTED_COMMAS.replace(jsonStr, "{");    
        
        return jsonStr;
    }
    
    private static boolean isEmptyJson(String json) {
        if (json == null)
            return true;
        
        return EMPTY_JSON.test(json);
    }    
}
